import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../common/services/index.dart';
import '../../../common/mixins/index.dart';
import '../../../common/components/index.dart';
import '../../../common/utils/index.dart';
import '../../../common/api/index.dart';
import '../../../common/models/user/forms/profile_edit_form.dart';

/// 个人信息编辑页面控制器
/// 
/// 🎯 核心职责：
/// - 管理用户个人信息的编辑状态
/// - 处理表单验证和数据保存
/// - 处理头像和相册图片的上传
/// - 提供智能变更检测（只保存修改的字段）
/// 
/// 📋 架构设计：
/// - 使用UserProfileMixin访问用户信息（包含等级名称等计算型字段）
/// - 采用批量保存策略，减少网络请求
/// - 响应式监听UserService变化，自动同步UI
/// 
/// 遵循GetX控制器标准化结构（7个部分）
class PeofileDetialController extends GetxController with UserProfileMixin {
  // 1. 静态常量
  static const String tag = 'PeofileDetialController';
  
  // 2. 响应式变量（Rx系列）
  // 基础状态变量
  var isSaving = false.obs;                     // RxBool - 保存状态
  var hasError = false.obs;                     // RxBool - 错误状态
  var errorMessage = ''.obs;                    // RxString - 错误信息
  
  // 🎯 核心：使用 Form 模型统一管理所有表单字段
  late final Rx<ProfileEditForm> form;
  
  // 头像相关状态
  var selectedImagePath = ''.obs;               // 选中的本地图片路径
  var isLocalAvatar = false.obs;                // 是否为本地头像
  var isUploadingAvatar = false.obs;            // 是否正在上传头像
  
  // 3. 普通变量（非响应式）
  bool _isInitialized = false;
  
  // 4. 控制器和服务依赖
  final TextEditingController nickNameController = TextEditingController();
  final TextEditingController emailController = TextEditingController();
  final TextEditingController phoneController = TextEditingController();
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  
  UserService get _userService => Get.find<UserService>();
  
  // 5. 生命周期方法
  @override
  void onInit() {
    super.onInit();
    debugPrint('$tag: onInit - 控制器初始化');
    
    // 🎯 初始化 Form 模型
    final userProfile = _userService.currentUserProfile;
    if (userProfile != null) {
      form = ProfileEditForm.fromUserEntity(userProfile).obs;
    } else {
      form = ProfileEditForm().obs;
    }
  }
  
  // 私有初始化方法
  void _initData() {
    debugPrint('$tag: 初始化个人信息编辑页面数据');
    
    if (!_isInitialized) {
      // 检查用户登录状态
      _checkUserLoginStatus();
      
      // 加载用户信息
      _loadUserInfo();
      
      // 设置表单监听
      _setupFormListeners();
      
      // 设置已初始化标志
      _isInitialized = true;
      
      debugPrint('$tag: 页面数据初始化完成');
    }
    
    // 通知UI更新
    update(["profile_detial"]);
  }
  
  /// 检查用户登录状态
  void _checkUserLoginStatus() {
    final isLoggedIn = _userService.isLoggedIn;
    debugPrint('$tag: 用户登录状态检查 - isLoggedIn: $isLoggedIn');
    
    if (!isLoggedIn) {
      debugPrint('$tag: 用户未登录，返回上一页');
      _handleError('用户未登录');
      Get.back();
      return;
    }
  }
  
  /// 初始化表单控制器（从UserService获取数据）
  void _loadUserInfo() {
    try {
      debugPrint('$tag: 开始初始化表单控制器');
      
      final userProfile = currentUserProfile; // 直接从UserService获取
      if (userProfile != null) {
        
        debugPrint('$tag: 🔍 从UserService获取到的用户数据:');
        debugPrint('$tag:   📝 用户名: ${userProfile.username}');
        debugPrint('$tag:   📝 邮箱: ${userProfile.userEmail}');
        debugPrint('$tag:   📝 手机: ${userProfile.userPhone}');
        
        // 🎯 从 UserEntity 初始化 Form 模型
        form.value = ProfileEditForm.fromUserEntity(userProfile);
        
        // 🎯 同步到输入框控制器（用于 TextField 绑定）
        nickNameController.text = form.value.nickname;
        emailController.text = form.value.email;
        phoneController.text = form.value.phone;
        
        debugPrint('$tag: 表单控制器初始化完成 - ${userProfile.username}');
        debugPrint('$tag: 🎯 使用 Form 模型统一管理表单状态');
      } else {
        debugPrint('$tag: 未找到用户信息');
        _handleError('未找到用户信息');
      }
      
    } catch (e) {
      debugPrint('$tag: 初始化表单控制器失败: $e');
      _handleError('加载用户信息失败');
    }
  }
  
  /// 设置表单监听器
  void _setupFormListeners() {
    debugPrint('$tag: 设置表单监听器');
    
    // 🎯 监听输入框变化，同步到 Form 模型
    nickNameController.addListener(() {
      form.value.nickname = nickNameController.text;
      form.refresh();
      update(["profile_detial"]);
    });
    
    emailController.addListener(() {
      form.value.email = emailController.text;
      form.refresh();
      update(["profile_detial"]);
    });
    
    phoneController.addListener(() {
      form.value.phone = phoneController.text;
      form.refresh();
      update(["profile_detial"]);
    });
    
    // 🎯 监听UserService用户信息变化，自动更新表单
    ever(_userService.currentUserProfileRx, (userProfile) {
      if (userProfile != null) {
        debugPrint('$tag: UserService用户信息发生变化，更新表单');
        form.value = ProfileEditForm.fromUserEntity(userProfile);
        nickNameController.text = form.value.nickname;
        emailController.text = form.value.email;
        phoneController.text = form.value.phone;
        update(["profile_detial"]);
      }
    });
  }
  
  // 6. 业务方法
  
  // ==================== 用户信息访问 ====================
  // 注意：用户信息访问方法已通过 UserProfileMixin 提供
  // 可直接使用: currentUserProfile, userDisplayName, userName, userSex 等
  
  /// 🎯 获取编辑页面显示的年龄（实时计算）
  /// 
  /// 根据当前编辑的生日动态计算年龄，确保用户体验
  /// - 如果用户修改了生日，年龄会立即更新
  /// - 委托给 AgeUtil 进行计算
  /// 
  /// 用户体验优化：
  /// ```
  /// 用户修改生日：2025-10-02 → 1990-01-01
  ///            ↓
  /// 年龄立即更新：14岁 → 35岁
  /// ```
  int get displayAge {
    // 🎯 从 Form 模型获取生日计算年龄
    return AgeUtil.calculateAge(form.value.birthday);
  }
  
  // ==================== 智能变更检测方法 ====================
  
  /// 🎯 检测用户信息变更，只返回真正改变的字段（委托给 Form 模型）
  Map<String, dynamic> _detectChanges() {
    return form.value.detectChanges();
  }
  
  /// 检查是否有任何变更（委托给 Form 模型）
  bool get hasAnyChanges => form.value.hasChanges;
  
  // ==================== 表单验证相关方法（委托给 Form 模型）====================
  
  /// 验证昵称（委托给 Form 模型）
  String? validateNickName(String? value) => form.value.validateNickname();
  
  /// 验证邮箱（委托给 Form 模型）
  String? validateEmail(String? value) => form.value.validateEmail();
  
  /// 验证手机号（委托给 Form 模型）
  String? validatePhone(String? value) => form.value.validatePhone();
  
  // ==================== 头像选择相关方法 ====================
  
  /// 头像点击事件 - 显示选择底部弹出框
  void onAvatarTap() {
    debugPrint('$tag: 用户点击头像');
    _showAvatarSelectionBottomSheet();
  }
  
  /// 显示头像选择底部弹出框
  void _showAvatarSelectionBottomSheet() {
    ImagePickerBottomSheet.show(
      config: const ImagePickerConfig(
        title: '选择头像',
        cameraText: '拍照',
        galleryText: '从相册选择',
        maxWidth: 1080,
        maxHeight: 1080,
        imageQuality: 85,
      ),
      onImageSelected: (String imagePath) async {
        await _handleSelectedImage(imagePath);
      },
      onError: (String errorMessage, ImagePickerError? error) async {
        await _handleImagePickerError(errorMessage, error);
      },
    );
  }
  
  
  /// 🎯 处理选中的图片（企业级最佳实践）
  /// 
  /// 架构设计：
  /// 1. Controller负责UI状态管理和业务协调
  /// 2. Service负责API调用和数据同步
  /// 3. Service更新后自动触发UI响应式更新
  Future<void> _handleSelectedImage(String imagePath) async {
    try {
      debugPrint('$tag: Controller: 处理选中的图片 - $imagePath');
      
      // 1. 显示上传进度
      isUploadingAvatar.value = true;
      selectedImagePath.value = imagePath;
      isLocalAvatar.value = true;
      update(["profile_detial"]);
      
      // 2. 调用Service层上传并更新头像
      debugPrint('$tag: Controller: 调用Service上传头像');
      final uploadResult = await _userService.uploadAndUpdateAvatar(imagePath);
      
      if (uploadResult.success) {
        // ✅ 上传成功，Service已自动更新状态
        debugPrint('$tag: Controller: 头像上传成功');
        debugPrint('$tag: ✅ Service已更新，UI会自动响应');
        
        isLocalAvatar.value = false;
        selectedImagePath.value = '';
        
      } else {
        // ❌ 上传失败，恢复原来的头像状态
        debugPrint('$tag: Controller: 头像上传失败 - ${uploadResult.errorMessage}');
        isLocalAvatar.value = false;
        selectedImagePath.value = '';
        _handleError(uploadResult.errorMessage ?? '头像上传失败');
      }
      
    } catch (e) {
      debugPrint('$tag: Controller: 处理图片异常: $e');
      isLocalAvatar.value = false;
      selectedImagePath.value = '';
      _handleError('头像上传失败');
    } finally {
      // 3. 隐藏上传进度
      isUploadingAvatar.value = false;
      update(["profile_detial"]);
    }
  }
  
  /// 获取当前显示的头像路径
  String get currentAvatarPath {
    if (isLocalAvatar.value && selectedImagePath.value.isNotEmpty) {
      return selectedImagePath.value;
    }
    // 🎯 直接从UserService获取最新头像URL
    return _userService.currentUserProfile?.avatarUrl ?? '';
  }

  /// 处理图片选择错误
  Future<void> _handleImagePickerError(
    String errorMessage, 
    ImagePickerError? error,
  ) async {
    debugPrint('$tag: 处理图片选择错误 - $errorMessage');
    
    switch (error) {
      case ImagePickerError.permanentlyDenied:
        await _showPermissionSettingsDialog(errorMessage);
        break;
      case ImagePickerError.permissionDenied:
        debugPrint('$tag: 权限被拒绝 - $errorMessage');
        break;
      case ImagePickerError.noImageSelected:
        // 用户取消选择，不显示错误
        debugPrint('$tag: 用户取消选择图片');
        break;
      case ImagePickerError.deviceNotSupported:
        debugPrint('$tag: 设备不支持此功能');
        break;
      default:
        debugPrint('$tag: 图片选择错误 - $errorMessage');
        break;
    }
  }

  /// 显示权限设置对话框
  Future<void> _showPermissionSettingsDialog(String message) async {
    final shouldOpenSettings = await Get.dialog<bool>(
      AlertDialog(
        title: const Text('需要权限'),
        content: Text(
          '$message\n\n操作步骤：\n'
          '1. 点击"前往设置"\n'
          '2. 找到应用权限\n'
          '3. 开启相应权限',
        ),
        actions: [
          TextButton(
            onPressed: () => Get.back(result: false),
            child: const Text('取消'),
          ),
          TextButton(
            onPressed: () => Get.back(result: true),
            child: const Text('前往设置'),
          ),
        ],
      ),
    ) ?? false;
    
    if (shouldOpenSettings) {
      final permissionService = Get.find<PermissionService>();
      await permissionService.openAppSettings();
    }
  }
  
  // ==================== 保存相关方法 ====================
  
  /// 🎯 统一保存用户信息（批量保存所有修改 - 企业级最佳实践）
  /// 
  /// 架构设计：
  /// 1. Controller负责智能变更检测和业务协调
  /// 2. Service负责API调用和数据同步
  /// 3. Service更新后自动触发所有UI响应式更新
  Future<void> saveAllChanges() async {
    try {
      debugPrint('$tag: ==================== 开始批量保存用户信息 ====================');
      
      isSaving.value = true;
      hasError.value = false;
      update(["profile_detial"]);
      
      // 1. 智能变更检测 - 收集所有变更的字段
      final changes = _detectChanges();
      
      if (changes.isEmpty) {
        debugPrint('$tag: 💡 没有检测到任何变更，无需保存');
        isSaving.value = false;
        update(["profile_detial"]);
        return;
      }
      
      debugPrint('$tag: 🚀 Controller: 开始批量保存用户信息');
      debugPrint('$tag: 📝 变更字段: ${changes.keys.join(', ')}');
      debugPrint('$tag: 📊 变更详情: $changes');
      
      try {
        // 2. 调用Service层批量更新用户信息
        debugPrint('$tag: Controller: 调用Service批量更新');
        await _userService.updateUserInfo(changes);
        
        // 3. Service已更新，重新初始化本地编辑状态
        debugPrint('$tag: Controller: Service已更新，同步本地状态');
        _loadUserInfo();
        
        debugPrint('$tag: ✅ ==================== 批量保存完成 ====================');
        debugPrint('$tag: ✅ Service已更新，所有使用此数据的页面都会自动同步');
        
        // 延迟返回上一页
        await Future.delayed(const Duration(milliseconds: 300));
        Get.back();
        
      } catch (e) {
        // ❌ 保存失败
        debugPrint('$tag: ❌ 批量保存失败: $e');
        _handleError('保存个人信息失败: ${e.toString()}');
      }
      
    } catch (e) {
      debugPrint('$tag: ❌ 保存用户信息异常: $e');
      _handleError('保存时发生错误');
    } finally {
      isSaving.value = false;
      update(["profile_detial"]);
    }
  }
  
  /// 保存用户信息（兼容旧方法）
  Future<void> saveUserProfile() async {
    await saveAllChanges();
  }
  
  /// 重置表单
  void resetForm() {
    debugPrint('$tag: 重置表单');
    
    // 🎯 委托给 Form 模型重置
    form.value.reset();
    
    // 同步到输入框控制器
    nickNameController.text = form.value.nickname;
    emailController.text = form.value.email;
    phoneController.text = form.value.phone;
    
    // 重置状态
    form.refresh();
    hasError.value = false;
    errorMessage.value = '';
    
    update(["profile_detial"]);
  }
  
  /// 返回上一页
  void onBackTap() {
    debugPrint('$tag: 用户点击返回');
    
    // 直接返回，不再显示确认对话框
    Get.back();
  }
  
  // ==================== 本地编辑方法（不立即保存到服务器）====================
  
  /// 🎯 通用字段更新方法（更新 Form 模型）
  void _updateField(ProfileField field, dynamic value) {
    switch (field) {
      case ProfileField.nickname:
        nickNameController.text = value as String;
        form.value.nickname = value;
        debugPrint('$tag: 本地更新昵称: $value');
        break;
        
      case ProfileField.gender:
        form.value.gender = value as String;
        debugPrint('$tag: 本地更新性别: $value');
        break;
        
      case ProfileField.birthday:
        form.value.birthday = value as String;
        debugPrint('$tag: 本地更新生日: $value');
        break;
        
      case ProfileField.city:
        form.value.city = value as String;
        debugPrint('$tag: 本地更新城市: $value');
        break;
        
      case ProfileField.signature:
        form.value.signature = value as String;
        debugPrint('$tag: 本地更新签名: $value');
        break;
        
      case ProfileField.frequentPlaces:
        form.value.frequentPlaces = value as String;
        debugPrint('$tag: 本地更新常出没地: $value');
        break;
    }
    
    form.refresh();
    update(["profile_detial"]);
  }
  
  // ==================== 公开的更新方法（供View层调用）====================
  
  /// 更新昵称
  void updateLocalNickname(String newName) => _updateField(ProfileField.nickname, newName);
  
  /// 更新性别
  void updateLocalGender(String newGender) => _updateField(ProfileField.gender, newGender);
  
  /// 更新生日
  void updateLocalBirthday(String newBirthday) => _updateField(ProfileField.birthday, newBirthday);
  
  /// 更新城市
  void updateLocalCity(String newCity) => _updateField(ProfileField.city, newCity);
  
  /// 更新签名
  void updateLocalSignature(String newSignature) => _updateField(ProfileField.signature, newSignature);
  
  /// 更新常出没地
  void updateLocalFrequentPlaces(String newPlaces) => _updateField(ProfileField.frequentPlaces, newPlaces);
  
  /// 🎯 切换爱好选择状态（更新 Form 模型）
  void toggleHobby(String hobby) {
    final hobbies = form.value.hobbies;
    if (hobbies.contains(hobby)) {
      hobbies.remove(hobby);
    } else {
      hobbies.add(hobby);
    }
    form.refresh();
    debugPrint('$tag: 本地切换爱好: $hobby -> ${form.value.hobbies}');
    update(["profile_detial"]);
  }
  
  // ==================== 相册管理方法（本地修改，不立即保存）====================
  
  /// 从相机拍照选择相册图片（本地添加）
  Future<void> pickAlbumImageFromCamera() async {
    try {
      debugPrint('$tag: 从相机选择相册图片');
      
      final ImagePickerResult result = await ImagePickerHelper().pickImageFromCamera(
        maxWidth: 1080,
        maxHeight: 1080,
        imageQuality: 85,
      );
      
      if (result.success && result.imagePath != null) {
        // 🎯 先上传图片获取URL，再添加到本地相册（不保存到服务器）
        await _addLocalAlbumImage(result.imagePath!);
      } else if (result.error != null) {
        await _handleImagePickerError(result.errorMessage ?? '选择图片失败', result.error);
      }
      
    } catch (e) {
      debugPrint('$tag: 从相机选择图片失败: $e');
    }
  }
  
  /// 从相册选择图片（本地添加）
  Future<void> pickAlbumImageFromGallery() async {
    try {
      debugPrint('$tag: 从相册选择图片');
      
      final ImagePickerResult result = await ImagePickerHelper().pickImageFromGallery(
        maxWidth: 1080,
        maxHeight: 1080,
        imageQuality: 85,
      );
      
      if (result.success && result.imagePath != null) {
        // 🎯 先上传图片获取URL，再添加到本地相册（不保存到服务器）
        await _addLocalAlbumImage(result.imagePath!);
      } else if (result.error != null) {
        await _handleImagePickerError(result.errorMessage ?? '选择图片失败', result.error);
      }
      
    } catch (e) {
      debugPrint('$tag: 从相册选择图片失败: $e');
    }
  }
  
  /// 🎯 添加图片到本地相册（上传获取URL，但不保存到服务器）
  /// 
  /// 注意：相册图片采用延迟保存策略
  /// 1. 立即上传获取URL
  /// 2. 添加到 Form 模型的相册列表
  /// 3. 等待用户点击"保存"按钮批量保存
  Future<void> _addLocalAlbumImage(String imagePath) async {
    try {
      debugPrint('$tag: Controller: 上传相册图片获取URL: $imagePath');
      
      final uploadResult = await UserApi.uploadAvatar(
        imagePath,
        userId: userId,
      );
      
      if (uploadResult.success && uploadResult.imgUrl != null) {
        // 🎯 添加到 Form 模型的相册列表
        form.value.albumImages.add(uploadResult.imgUrl!);
        form.refresh();
        debugPrint('$tag: ✅ 图片添加到本地相册: ${uploadResult.imgUrl}');
        debugPrint('$tag: 💡 等待批量保存时一起提交到服务器');
        update(["profile_detial"]);
      } else {
        throw Exception(uploadResult.errorMessage ?? '上传失败');
      }
      
    } catch (e) {
      debugPrint('$tag: ❌ 添加相册图片失败: $e');
      _handleError('添加相册图片失败');
    }
  }
  
  /// 替换相册图片（本地修改）
  Future<void> replaceLocalAlbumImage(int index) async {
    try {
      debugPrint('$tag: 替换相册图片: index=$index');
      
      final ImagePickerResult result = await ImagePickerHelper().pickImageFromGallery(
        maxWidth: 1080,
        maxHeight: 1080,
        imageQuality: 85,
      );
      
      if (result.success && result.imagePath != null) {
        final uploadResult = await UserApi.uploadAvatar(
          result.imagePath!,
          userId: userId,
        );
        
        if (uploadResult.success && uploadResult.imgUrl != null) {
          // 🎯 替换 Form 模型中的图片
          if (index >= 0 && index < form.value.albumImages.length) {
            form.value.albumImages[index] = uploadResult.imgUrl!;
            form.refresh();
            debugPrint('$tag: ✅ 本地替换相册图片成功');
            update(["profile_detial"]);
          }
        }
      }
      
    } catch (e) {
      debugPrint('$tag: ❌ 替换相册图片失败: $e');
      _handleError('替换相册图片失败');
    }
  }
  
  /// 删除相册图片（本地修改）
  void deleteLocalAlbumImage(int index) {
    try {
      debugPrint('$tag: 删除相册图片: index=$index');
      
      // 🎯 从 Form 模型删除
      if (index >= 0 && index < form.value.albumImages.length) {
        form.value.albumImages.removeAt(index);
        form.refresh();
        debugPrint('$tag: ✅ 本地删除相册图片成功');
        update(["profile_detial"]);
      }
      
    } catch (e) {
      debugPrint('$tag: ❌ 删除相册图片失败: $e');
    }
  }
  
  
  // ==================== 错误处理相关方法 ====================
  
  /// 处理错误
  void _handleError(String message) {
    hasError.value = true;
    errorMessage.value = message;
    
    debugPrint('$tag: 处理错误 - $message');
    
    update(["profile_detial"]);
  }
  
  /// 重置错误状态
  void resetErrorState() {
    debugPrint('$tag: 重置错误状态');
    
    hasError.value = false;
    errorMessage.value = '';
    
    update(["profile_detial"]);
  }

  // 7. 生命周期方法
  @override
  void onReady() {
    super.onReady();
    debugPrint('$tag: onReady - 页面准备就绪');
    _initData();
  }

  @override
  void onClose() {
    debugPrint('$tag: onClose - 控制器销毁');
    
    // 清理表单控制器
    nickNameController.dispose();
    emailController.dispose();
    phoneController.dispose();
    
    super.onClose();
  }
}

/// 🎯 个人资料字段枚举
/// 
/// 用于标识不同的个人资料字段类型
/// 配合策略模式实现统一的字段更新逻辑
enum ProfileField {
  /// 昵称
  nickname,
  
  /// 性别
  gender,
  
  /// 生日
  birthday,
  
  /// 城市
  city,
  
  /// 个性签名
  signature,
  
  /// 常出没地
  frequentPlaces,
}
